/*****************************************
**  Nom : RASPAUD - COLLOMB				**
**	Nom du fichier : InitPartie.c		**
**	Description : Regroupe toutes les	**
**				  fonctions 			**
**				  d'initialisation		**
**										**
**	Date : 19/08/2014				    **
**  Statut : Release					**
*****************************************/

/*****************************************
**  Zone de declaration des includes    **
*****************************************/
#include "struct.h"

/*************************************************
**  Zone de declaration des Fonctions PUBLIC    **
*************************************************/

/*************************************************************************
**  [Fonction InitPartie_InitCarte]        		    					**
**  Création d'une carte										        **
**																		**
**	Entrees : int valeur - Valeur des cartes	                        **
**			: int signe - Signe des cartes								**
**																		**
**	Sorties : S_CARTE													**
**				Description de la carte créée                           **
**										                                **
**************************************************************************/

S_CARTE* InitPartie_InitCarte(int valeur, int signe)
{
	S_CARTE *carte;
	
	carte=(S_CARTE*)malloc(sizeof(S_CARTE));
	if(carte==NULL)
	{
		printf("ERROR !\n");
		return NULL;
	}
	carte->valeur=valeur;
	carte->signe=signe;
	return carte;
}


/*************************************************************************
**  [Fonction InitPartie_InitPaquet]       		    					**
**  Création d'un paquet 										        **
**																		**
**	Entrees : FIFO_PAQUET paquet - La FIFO "table"	      	            **
**																		**
**																		**
**	Sorties : FIFO_PAQUET												**
**				Description d'un paquet de carte                        **
**										                                **
**************************************************************************/

int InitPartie_InitPaquet(FIFO_PAQUET *paquet)
{
	int i=0,j=0;
	S_CARTE *nouvelle_carte,*carte_courante;
	
	//printf("InitPartie_InitPaquet : Début Fonction\n");
	for(i=1;i<=NOMBRE_SIGNE;i++)
	{
		for(j=1;j<=NOMBRE_CARTE;j++)
		{
			//printf("InitPartie_InitPaquet : lancement de la fonction init_carte\n");
			nouvelle_carte=InitPartie_InitCarte(j,i);
			if(nouvelle_carte==NULL)
			{
				printf("InitPartie_InitPaquet : Erreur lors de la création de la carte ! !\n");
				return -1;
			}
			//printf("InitPartie_InitPaquet : fin de la fonction init_carte\n");
			
			//printf("InitPartie_InitPaquet : signe %d sur valeur %d et appartient au joueur %d\n",i,j,paquet->nom_joueur);
			
			if(paquet->carte_in==NULL && paquet->carte_out==NULL) //1ere carte mise dans le paquet
			{
				//printf("InitPartie_InitPaquet : Début 1er mise dans paquet\n");
				paquet->nb_carte++;
				paquet->carte_in=nouvelle_carte;
				paquet->carte_out=nouvelle_carte;
				//printf("InitPartie_InitPaquet : affectation 1ere carte OK\n");
			}
			else //mise en tête du paquet
			{
				//printf("InitPartie_InitPaquet : Début mise dans paquet\n");
				paquet->nb_carte++;
				carte_courante=paquet->carte_in;
				paquet->carte_in=nouvelle_carte;
				nouvelle_carte->carte_suivante=carte_courante;
				//printf("InitPartie_InitPaquet : affectation carte OK\n");
			}
		}
	}
	//printf("InitPartie_InitPaquet : Fin Fonction !\n");
	return 0;
}


/*************************************************************************
**  [Fonction InitPartie_InitFIFO]       		    					**
**  Création et initialisation d'une FIFO correspondant a un joueur     **
**																		**
**	Entrees : int *nom_joueur - Identification d'un joueur via un numero**
**																		**
**																		**
**	Sorties : FIFO_PAQUET												**
**				Description d'un joueur avec ses cartes                 **
**										                                **
**************************************************************************/

FIFO_PAQUET InitPartie_InitFIFO(int nom_joueur)
{
	FIFO_PAQUET FIFO; //sera un élément du paquet pour distribuer ET pour poser les cartes durant la partie !!!
	
	//printf("InitPartie_InitFIFO : FIFO créer --> mise en mémoire\n");
	FIFO.nom_joueur=nom_joueur;
	FIFO.nb_carte=0;
	FIFO.carte_in=NULL;
	FIFO.carte_out=NULL;
	//printf("InitPartie_InitFIFO : Fin fonction --> envoi de la FIFO OK !\n");
	return FIFO;
}

/*************************************************************************
**  InitPartie_InitPartie			                		    					**
**  Description de la fonction	:initialise tous les 
	paquets de cartes 													**
**																		**
**	Entrees : FIFO_PAQUET --> FIFO du paquet "table" 					**
**			  FIFO_PAQUET --> FIFO du paquet "J1" 	
			  FIFO_PAQUET --> FIFO du paquet "J2" 
			  FIFO_PAQUET --> FIFO du paquet "J3" 
			  FIFO_PAQUET --> FIFO du paquet "J4" 						**
**																		**
**	Sorties : int --> si -1=Erreur // si 0-OK							**
**									                                    **
**									                                    **
**************************************************************************/
int InitPartie_InitPartie(FIFO_PAQUET *table, FIFO_PAQUET *J1, FIFO_PAQUET *J2, FIFO_PAQUET *J3, FIFO_PAQUET *J4)
{
	int test=-1,random=0,i=1,valid[NOMBRE_JOUEUR],random2=0;
	
	memset(valid,0,sizeof(valid));
	test=InitPartie_InitPaquet(table);
	if(test==-1)
	{
		printf("InitPartie_InitPartie : Erreur lors de l'init du paquet table !\n");
		return -1;
	}
	//printf("InitPartie_InitPartie : table.nb_carte = %d \n",table->nb_carte);

	// 52 cartes / 4 = 13 cartes par personnes
	srand(time(NULL)); //ligne obligatoire pour que le nombre retourné par DrlmntPartie_Random soit différent à chaque appel
	while(i<=NOMBRE_CARTE_PAR_JOUEUR)
	{
		while(valid[0]!=1 || valid[1]!=1 || valid[2]!=1 || valid[3]!=1)
		{
			random=DrlmntPartie_Random(NOMBRE_JOUEUR); //NOMBRE_JOUEUR=constante
			//printf("InitPartie_InitPartie : random=%d\n",random);
			if(random==0)
			{
				printf("InitPartie_InitPartie : Erreur de la fonction 'DrlmntPartie_Random' !\n");
				return -1;
			}
////////////////////////////////////////////////////////////////////////////////////////////////////////			
			if(random==1 && valid[0]==0)
			{
				random2=DrlmntPartie_Random(NOMBRE_JOUEUR);
				if(random2==0)
				{
					printf("InitPartie_InitPartie : Erreur de la fonction 'DrlmntPartie_Random' !\n");
					return -1;
				}
				if(random2<=2)
				{
					test=DrlmntPartie_EchgFIFOin(table,J1);
					if(test==-1)
					{
						printf("InitPartie_InitPartie : Erreur dans 'DrlmntPartie_EchgFIFOin' case 1\n");
						return -1;
					}
				}
				else
				{
					test=DrlmntPartie_EchgFIFOout(table,J1);
					if(test==-1)
					{
						printf("InitPartie_InitPartie : Erreur dans 'DrlmntPartie_EchgFIFOout' case 1\n");
						return -1;
					}
				}
				valid[0]=1;
				//printf("InitPartie_InitPartie : valid[0]=1\n");
			}
///////////////////////////////////////////////////////////////////////////////////////////////////////
			if(random==2 && valid[1]==0)
			{
				random2=DrlmntPartie_Random(NOMBRE_JOUEUR);
				if(random2==0)
				{
					printf("InitPartie_InitPartie : Erreur de la fonction 'DrlmntPartie_Random' !\n");
					return -1;
				}
				if(random2<=2)
				{
					test=DrlmntPartie_EchgFIFOin(table,J2);
					if(test==-1)
					{
						printf("InitPartie_InitPartie : Erreur dans 'DrlmntPartie_EchgFIFOin' case 2\n");
						return -1;
					}
				}
				else
				{
					test=DrlmntPartie_EchgFIFOout(table,J2);
					if(test==-1)
					{
						printf("InitPartie_InitPartie : Erreur dans 'DrlmntPartie_EchgFIFOout' case 2\n");
						return -1;
					}
				}
				valid[1]=1;
				//printf("InitPartie_InitPartie : valid[1]=1\n");
			}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
			if(random==3 && valid[2]==0)
			{
				random2=DrlmntPartie_Random(NOMBRE_JOUEUR);
				if(random2==0)
				{
					printf("InitPartie_InitPartie : Erreur de la fonction 'DrlmntPartie_Random' !\n");
					return -1;
				}
				if(random2<=2)
				{
					test=DrlmntPartie_EchgFIFOin(table,J3);
					if(test==-1)
					{
						printf("InitPartie_InitPartie : Erreur dans 'DrlmntPartie_EchgFIFOin' case 3\n");
						return -1;
					}
				}
				else
				{
					test=DrlmntPartie_EchgFIFOout(table,J3);
					if(test==-1)
					{
						printf("InitPartie_InitPartie : Erreur dans 'DrlmntPartie_EchgFIFOout' case 3\n");
						return -1;
					}
				}
				valid[2]=1;
				//printf("InitPartie_InitPartie : valid[2]=1\n");
			}
////////////////////////////////////////////////////////////////////////////////////////////////////////
			if(random==4 && valid[3]==0)
			{
				random2=DrlmntPartie_Random(NOMBRE_JOUEUR);
				if(random2==0)
				{
					printf("InitPartie_InitPartie : Erreur de la fonction 'DrlmntPartie_Random' !\n");
					return -1;
				}
				if(random2<=2)
				{
					test=DrlmntPartie_EchgFIFOin(table,J4);
					if(test==-1)
					{
						printf("InitPartie_InitPartie : Erreur dans 'DrlmntPartie_EchgFIFOin' case 4\n");
						return -1;
					}
				}
				else
				{
					test=DrlmntPartie_EchgFIFOout(table,J4);
					if(test==-1)
					{
						printf("InitPartie_InitPartie : Erreur dans 'DrlmntPartie_EchgFIFOout' case 4\n");
						return -1;
					}
				}
				valid[3]=1;
				//printf("InitPartie_InitPartie : valid[3]=1\n");
			}
		}
		i++;
		memset(valid,0,sizeof(valid));
	}
	return 0;
}
